package com.chaochis.wind.base_config.context_config;

import com.chaochis.wind.base_exceptions.ContextNotInitException;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.NonNull;

@Configuration
public class WindContext implements ApplicationContextAware {

    private static ApplicationContext context;// 风旅系统上下文对象

    /**
     * 继承父类设置风旅系统上下文环境对象的方法
     * @param applicationContext 当前启动的风旅上下文环境
     * @throws BeansException 父类抛出的异常
     */
    @Override
    public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }

    /**
     * 检测风旅系统上下文环境是否正常初始化
     * @throws ContextNotInitException 风旅上下文环境未成功初始化异常
     */
    private static void checkContext() throws ContextNotInitException {
        if (context == null) {
            throw new ContextNotInitException("风旅上下文环境初始化失败!");
        }
    }

    /**
     * 根据名字获取风旅系统当前上下文环境的bean
     * @param name bean的名字
     * @return 返回获取到的bean对象
     * @throws ContextNotInitException 风旅上下文环境未成功初始化异常
     */
    public static Object getBean(String name) throws ContextNotInitException {
        checkContext();
        return context.getBean(name);
    }

    /**
     * 根据类信息获取风旅系统当前上下文环境的bean
     * @param cls 类信息
     * @return 返回获取到的bean对象
     * @param <T> bean模板
     * @throws ContextNotInitException 风旅上下文环境未成功初始化异常
     */
    public static <T> T getBean(Class<T> cls) throws ContextNotInitException {
        checkContext();
        return context.getBean(cls);
    }

    /**
     * 根据名字以及类信息获取风旅系统当前上下文环境的bean
     * @param name bean的名字
     * @param cls bean的类信息
     * @return 返回获取到的bean对象
     * @param <T> bean模板
     * @throws ContextNotInitException 风旅上下文环境未成功初始化异常
     */
    public static <T> T getBean(String name, Class<T> cls) throws ContextNotInitException {
        checkContext();
        return context.getBean(name, cls);
    }

}
